package main

import (
	"fmt"
	"runtime"
	"sync"
	"time"
)

var (
	count int64 = 0 // 并发安全
	wg    sync.WaitGroup
	mx    sync.Mutex
	ch    = make(chan int64, 1)
)

func inc() {
	defer wg.Done()
	for i := 0; i < 100000; i++ {
		// atomic 原子，不可分割
		// count++ //非原子操作
		// count = count + 1 //非原子操作
		// atomic.AddInt64(&count, 1)
		// mx.Lock() // 加锁 拿不到锁，协程阻塞，如果不阻塞，说明你是唯一拿到锁的
		// count++
		// mx.Unlock() // 解锁
		t := <-ch
		t++
		ch <- t
	}
}

func main() {
	wg.Add(5)
	ch <- 0
	start := time.Now()
	for i := 0; i < 5; i++ {
		go inc()
	}
	wg.Wait()
	fmt.Printf("协程数 %d\n", time.Since(start).Microseconds())
	fmt.Printf("执行时长为 %d\n", runtime.NumGoroutine())
	fmt.Printf("count=%d\n", <-ch)
}

// 串行 		1021
// 并行 		1024 少, 并发, 不安全, 绝对不能要
// 并行 atomic  8039
// 并行 metex   16314
// 并行 chan	105982
